Individual assignment:
This week was about connecting and communicating different or same microprocessors/projects. After Neils' lecture I went through some literature regarding protocols in communication and I want to quote that information below.
Introduction
There are two methods used to transmit data between digital devices: serial transmission and parallel transmission. Serial data transmission sends data bits one after another over a single channel. Parallel data transmission sends multiple data bits at the same time over multiple channels.
The protocols for serial data transfer can be grouped into two types: Synchronous and Asynchronous. A synchronous serial interface always pairs its data line(s) with a clock signal, so all devices on a synchronous serial bus share a common clock. Asynchronous means that data is transferred without support from an external clock signal.
I2C
I2C (Inter-Integrated Circuit) is a serial communication protocol. I2C is synchronous, the output signal(bits) is synchronized to the sampling of bits by a clock signal shared between the master and the slave. So I2C only needs 2 lines for communication. SDA (Serial Data Line) and SCL (Serial Clock line).
Examples for I2C communication: 12x6 LCD Interfacing , Between two arduino boards etc.
Other commonly used communication protocols are Universal Asynchronous Reception and Transmission (UART) and Serial Peripheral interface (SPI). For my work I did I2C protocol.
My Literature References [1] [2]
‣ Intorduction to My Work
For my assignment I decided to communicate two of my previous boards. But i understood that any pull resistor should be there between VCC and SDA or SCL line either in master or slave board. But I couldn't find any apt board fulfilling this conduction. So I changed my mind to do communication between my board from week_6 electronic design- Echo board and Output board board from Eldho’s Output week
Below image shows the SDA and SCL port of slave and master boards
‣ Programming
Arduino IDE is used for programming boards. For I2C communication we need to install Wire.h to arduino library. The Wire library allows you to communicate with I2C devices. So I wrote programme in such a way that when switch is HIGH for master board a signal will be sent and RGB led will be HIGH Both programmes are compiled and uploaded.
Master Program
#include < Wire.h> #include< SoftwareSerial.h> #define button A3 #define led1 A2 SoftwareSerial mySerial(1, 0); // RX, TX void setup() { pinMode(led1, OUTPUT); digitalWrite(led1, HIGH); delay(2000); digitalWrite(led1, LOW); mySerial.begin(9600); mySerial.println("Start"); Wire.begin(); pinMode(button, INPUT_PULLUP); } void loop() { int data; data = digitalRead(button); mySerial.println(data); if (data == 1) { digitalWrite(led1, HIGH); Wire.beginTransmission(8); Wire.write(1); Wire.endTransmission(); } else { digitalWrite(led1, LOW); Wire.beginTransmission(8); Wire.write(0); Wire.endTransmission(); } delay(500); }
Slave Program
#include < Wire.h> #define led 2 void setup() { Wire.begin(8); Wire.onReceive(receiveEvent); pinMode(led, OUTPUT); } void loop() { delay(100); } void receiveEvent(int howMany) { int x = Wire.read(); if (x == 1) { digitalWrite(led, HIGH); } if (x == 0) { digitalWrite(led, LOW); } }
Compiling and uploading program using Arduino IDE. Since RGB LED is common anode connection we get low in RGB led when Master board switch is high.
I also used a serial monitor for diagnosing any error . My boards communicated properly and video is shown below.
My Working Video
Lessons Learned
Here I want to make note of a mistake that I made earlier. In previous boards I couldn't add pull up resistors between SDA, SCL lines. So I was forced to take a board from Fab mate- Eldho Kurian.
Group Assignment
Link to week13- Networking and communication grop assignment page